package com.example.designpatterns.state;

/**
 * Context类 - 环境/上下文类
 * 
 * 维护一个对具体状态对象的引用，并将与状态相关的操作委托给当前状态对象
 */
public class Context {
    // 当前状态
    private State state;
    // 订单号
    private String orderNumber;
    
    /**
     * 创建一个上下文对象，初始状态为待付款
     * @param orderNumber 订单号
     */
    public Context(String orderNumber) {
        this.orderNumber = orderNumber;
        // 初始状态为待付款
        this.state = new PendingPaymentState();
    }
    
    /**
     * 更改状态
     * @param state 新状态
     */
    public void setState(State state) {
        this.state = state;
    }
    
    /**
     * 获取当前状态
     * @return 当前状态
     */
    public State getState() {
        return state;
    }
    
    /**
     * 获取订单号
     * @return 订单号
     */
    public String getOrderNumber() {
        return orderNumber;
    }
    
    /**
     * 支付订单
     */
    public void pay() {
        state.pay(this);
    }
    
    /**
     * 发货
     */
    public void ship() {
        state.ship(this);
    }
    
    /**
     * 收货
     */
    public void receive() {
        state.receive(this);
    }
    
    /**
     * 申请退款
     */
    public void refund() {
        state.refund(this);
    }
    
    /**
     * 取消订单
     */
    public void cancel() {
        state.cancel(this);
    }
    
    /**
     * 获取订单状态描述
     * @return 状态描述
     */
    public String getStatusDescription() {
        return "订单 " + orderNumber + " 当前状态：" + state.getDescription();
    }
} 